package flow_graph;

import util.List;
import temp.Temp;
import graph.Node;


public abstract class FlowGraph extends graph.Graph
{
    /**
     * O Conjunto  de temporários definidos  pela instrução ou bloco 
     */
    public abstract List<Temp> def(Node node);

    /**
     * O Conjunto  de temporários definidos  pela instrução ou bloco 
     */
    public abstract List<Temp> use(Node node);

    /**
     * Verdade se o noh representa uma instrução move,
     */
    public abstract boolean isMove(Node node);

    /**
     * Debbug
     */
    public void show(java.io.PrintStream out)
    {
        for (List<Node>p=nodes(); p!=null; p=p.tail)
        {
            Node n = p.head;
            out.print(n.toString());
            out.print(": ");
            for(List<Temp> q=def(n); q!=null; q=q.tail)
            {
                out.print(q.head.toString());
                out.print(" ");
            }
            out.print(isMove(n) ? "<= " : "<- ");
            for(List<Temp> q=use(n); q!=null; q=q.tail)
            {
                out.print(q.head.toString());
                out.print(" ");
            }
            out.print("; goto ");
            for(List<Node> q=n.succ(); q!=null; q=q.tail)
            {
                out.print(q.head.toString());
                out.print(" ");
            }
            out.println();
        }
    }
}
